package netty.demo_07_WebSocket;


import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.time.LocalDateTime;

/**
 * Netty 通过WebSocket编程实现服务器和客户端长连接
 * 服务端 的 处理器
 *
 * @author chenyuan
 * @date 2020/11/11 10:18
 */
public class WebServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
	// TextWebSocketFrame 类型是 WebSocket 的一个子类，表示一个文本帧

	@Override
	protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame msg) throws Exception {
		System.out.println("服务器端收到消息：" + msg.text());
		// 回复浏览器
		channelHandlerContext.channel().writeAndFlush(
				new TextWebSocketFrame("【服务器】" + LocalDateTime.now() + " | " + msg.text()));

	}

	// web 连接后触发
	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		// id 表示标识，asLongText 输出的是唯一的，asShortText 不一定是唯一的
		System.out.println("handlerAdded 被调用-- " + ctx.channel().id().asLongText() + " (LongText)");
		System.out.println("handlerAdded 被调用-- " + ctx.channel().id().asShortText() + " (ShortText)");
	}

	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
		// id 表示标识，asLongText 输出的是唯一的，asShortText 不一定是唯一的
		System.out.println("handlerRemoved 被调用-- " + ctx.channel().id().asLongText() + " (LongText)");
		System.out.println("handlerRemoved 被调用-- " + ctx.channel().id().asShortText() + " (ShortText)");
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		System.out.println("【异常】 " + cause.getMessage());
		ctx.close();
	}
}
